home *** CD-ROM | disk | FTP | other *** search
/ Suzy B Software 2 / Suzy B Software CD-ROM 2 (1994).iso / extras / falcon / wd2d_pro / sources / mod_dpro.s < prev    next >
Text File  |  1995-04-27  |  19KB  |  953 lines

  1. ;    bsr init_d2d
  2. ;    bsr play_d2d
  3. ;
  4. ;check:    bsr check_d2d_load
  5. ;    bra check
  6. ;
  7. ;    bsr stop_d2d    (inutile car on restore)
  8. ;    bsr restore_d2d
  9.  
  10. ****************************************************************************
  11. * Module Replay D2D avec prise de retard & décompactage * (c)Wax 18/XII/94 *
  12. ****************************************************************************
  13. ;TAILLE_MAGIC=5*6*7*8*2
  14. ;NBR_BUFF=4
  15. ;LENGTH_REPLAY=(TAILLE_MAGIC+2)*32
  16.  
  17.     ;clr which_clock        ; interne
  18.     ;clr loop            ; pas de loop
  19.     ;clr replay_in_psst
  20.     ;move #20,nb_ms        ; 20 ms ps-st
  21.  
  22.     ; pour TRACK 16 bit
  23.     ;move.w #1,which_rout        ; 1 ou 2
  24.     ;move.b #FREQ8,frequency_for_play
  25.     ;clr.l header        ; pas de header
  26.  
  27.     ; pour DVSW
  28.     ;move.w #3,which_rout        ; routine par défaut
  29.  
  30.  
  31. * Decompact=1 : échantillon 16-bit stéréo
  32. * Decompact=2 : l'échantillon est joué comme étant mono-16 bits
  33. * Decompact=2b: la meme chose avec retard x ms de a droite/gauche
  34. * Decompact=3 : Décompression DVS WAX D2D
  35.  
  36. ; return errors
  37. SEMAPHORE_LOCKED=-1
  38. BAD_FILENAME=-2
  39. BAD_DVW_HEADER=-3
  40. NOT_ENOUGH_MEMORY=-4
  41.  
  42. allocate_dis_memory:
  43.     move.w #0,-(sp)    ; 0=ST, 1=TT, 2=ST->TT, 3=TT->ST
  44.     move.l d0,-(sp)    ; d0 = longueur to malloc
  45.     appel dos,$44,8    ; xmalloc
  46.     clr d7
  47.     tst.l d0
  48.     bgt.s .ok
  49.     moveq #NOT_ENOUGH_MEMORY,d7
  50. .ok:    tst d7
  51.     rts
  52.  
  53. desallocate_dis_memory:
  54.     move.l d0,-(sp)
  55.     appel dos,$49,6        ; Mfree
  56.     rts
  57.  
  58. init_d2d:    appel xbios,128,2        ; sound lock
  59.     moveq #SEMAPHORE_LOCKED,d7
  60.     tst d0
  61.     bpl.s not_locked
  62.     rts
  63.  
  64. not_locked:
  65.     file_open read,name_2_load    ; ouverture du fichier
  66.     moveq #BAD_FILENAME,d7
  67.     tst d0
  68.     ble erraru
  69.     move.w d0,save_handle        ; save handle
  70.  
  71.     clr end_of_file
  72.  
  73.     move.l #NBR_BUFF*LENGTH_REPLAY,d0
  74.     bsr allocate_dis_memory
  75.     bmi erraru2
  76.     move.l d0,ad_main_buffer
  77.  
  78.     move.w which_rout,d0
  79.     sub #1,d0
  80.     mulu #4*3,d0
  81.     lea table_routs,a0
  82.     jsr ([a0,d0.w])        ; init_routs
  83.     tst d7
  84.     bmi erraru3
  85.  
  86.     bsr load_first_buffs
  87.     tst d7
  88.     bmi erraru2
  89.  
  90.     bsr stop_timer_a
  91.  
  92.     bsr set_swap_buffs        ; calcule les ad.
  93.     bsr config_dma_replay        ; init hard du DMA
  94.  
  95.     move #-1,semaphore        ; init du sémaphore
  96.     move #0,semaphore_2        ; init du sémaphore 2
  97.  
  98.     move.l ad_main_buffer,a0
  99.     add.l #LENGTH_REPLAY,a0
  100.     move.l a0,-(sp)        ; fin
  101.     sub.l #LENGTH_REPLAY,a0
  102.     move.l a0,-(sp)        ; début
  103.     clr.w -(sp)
  104.     appel xbios,131,12        ; set dma replay buf
  105. ;    bsr set_dma_play_buff_ad    ; adresse à jouer
  106.  
  107.     bsr set_timer_a        ; routine timer A
  108.     bsr start_timer_a
  109.  
  110.     clr d7
  111.     rts
  112.  
  113. play_d2d:    move.w #%00000011,-(sp)
  114.     appel xbios,136,4
  115.     ;move.b #%0x00xx11,$ffff8901    ; DMA ctrl register
  116.     move #1,sample_playing
  117.     rts
  118.  
  119. stop_d2d:    move.w #%00000000,-(sp)
  120.     appel xbios,136,4
  121.     ;move.b #%00000000,$ffff8901    ; on arrete
  122.     rts
  123.  
  124. restore_d2d:bsr stop_d2d
  125.  
  126.     move.w which_rout,d0
  127.     sub #1,d0
  128.     mulu #4*3,d0
  129.     lea table_routs,a0
  130.     jsr ([a0,d0.w,8])        ; end_routs
  131.  
  132.     bsr restore_timera
  133.  
  134. erraru3:    move.l ad_main_buffer,d0
  135.     bsr desallocate_dis_memory
  136.  
  137. erraru2:    file_close save_handle
  138.  
  139. erraru:    appel xbios,129,2        ; sound unlock
  140.     rts
  141. ****************************************************************************
  142. check_d2d_load:
  143.     tst semaphore
  144.     ble nothing_2load
  145.  
  146.     save d0-a6
  147. check_another:
  148.     tst end_of_file    ; si fin de fichier : revenir
  149.     bne must_load0
  150.  
  151. .redo:    move semaphore,d0
  152.     beq that_was_last
  153.  
  154.     cmp.w #NBR_BUFF,d0
  155.     blt.s .rattrapable
  156.     sub.w #NBR_BUFF,semaphore
  157.     bra.s .redo            ; on a bouclé : tant pis ...
  158. .rattrapable:
  159.  
  160.     ; il faut charger le plus ancien qd on a du retard
  161.     ; i.e. : le dernier (fini de joué à l'instant si semaphore=1)
  162.  
  163. loadsome0:    move.l ptr_d2d_load+4*(NBR_BUFF-1),a0    ; début
  164.     move.l #LENGTH_REPLAY,d0
  165.  
  166.     move.w which_rout,d1
  167.     sub #1,d1
  168.     mulu #4*3,d1
  169.     lea table_routs,a1
  170.     jsr ([a1,d1.w,4])        ; load_routs
  171.  
  172.     lea ptr_d2d_load,a0
  173.     move.l (a0),d0
  174.     REPT NBR_BUFF-1
  175.     move.l 4(a0),(a0)+        ; swapping des adresses des buffers
  176.     ENDR
  177.     move.l d0,ptr_d2d_load+4*(NBR_BUFF-1)
  178. *    move.l d0,(a0)
  179.  
  180.     tst end_of_file
  181.     bne.s loaded0
  182.  
  183.     sub.w #1,semaphore
  184.     bra check_another    ; de tout rattraper sans gèner Mr DMA
  185.  
  186. that_was_last:
  187.     load d0-a6
  188. nothing_2load:
  189.     rts
  190.  
  191.     ; dans le cas ou la fin de fichier est atteinte, il faut
  192.     ; charger tout buffer de retard avec des 000 mais pas
  193.     ; décrémenter le sémaphore
  194.  
  195. must_load0:    move semaphore,d0
  196.     cmp semaphore_2,d0
  197.     ble.s that_was_last
  198.  
  199.     bra loadsome0
  200.  
  201. loaded0:    add #1,semaphore_2
  202.     bra.s must_load0
  203. ****************************************************************************
  204. load_first_buffs:
  205.  
  206.     move #NBR_BUFF-1,d1
  207.     move.l ad_main_buffer,a0
  208.     move.l #LENGTH_REPLAY,d0    ; on charge la totalité
  209.  
  210. .load_all:
  211.     save d0/d1/a0
  212.     move.w which_rout,d1
  213.     sub #1,d1
  214.     mulu #4*3,d1
  215.     lea table_routs,a1
  216.     jsr ([a1,d1.w,4])        ; load_routs
  217.     load d0/d1/a0
  218.     add.l #LENGTH_REPLAY,a0
  219.     dbf d1,.load_all
  220.  
  221.     clr d7
  222.     rts
  223.         ****************************
  224.  
  225.         ; au départ on met le 1 à jouer
  226.         ; dès le début une inter arrive
  227.         ; et le deux est mis en attente
  228.         ; on a donc le troisième en tête
  229.         ; le prochain en fin et le courant en fin-1
  230. set_swap_buffs:
  231.     move.l ad_main_buffer,a0
  232.     lea ptr_d2d_load,a1
  233.     lea ptr_d2d_inter,a2
  234.     move.l a0,4*(NBR_BUFF-1)(a1)    ; on le joue (1)
  235.     move.l a0,4*(NBR_BUFF-1)(a2)
  236.  
  237.     move #NBR_BUFF-1-1,d0        ; ordre
  238. .calc_swap:    add.l #LENGTH_REPLAY,a0        ; 2.3.4.5.6.7.8.1
  239.     move.l a0,(a1)+
  240.     move.l a0,(a2)+
  241.     dbf d0,.calc_swap
  242.     rts
  243.  
  244.     BSS
  245. ptr_d2d_load:ds.l NBR_BUFF
  246. .safe1:    ds.l 2
  247. ptr_d2d_inter:ds.l NBR_BUFF
  248. .safe2:    ds.l 2
  249.     TEXT
  250.             ******
  251. config_dma_replay:
  252.     move.w #2,-(sp)
  253.     move.w #4,-(sp)
  254.     appel xbios,130,6
  255.  
  256.     move.w #1,-(sp)
  257.     appel xbios,132,4
  258.     ;move.b #%01xxxx00,$ffff8921    ; sound mode ctrl : 16 bit/stéréo
  259.  
  260.     move.w #0,-(sp)        ; rec-trk
  261.     move.w #0,-(sp)        ; nr of play-trk
  262.     appel xbios,133,6
  263.     ;move.b #%xx00xx00,$ffff8920     ; DAC -> Track 0, Play 1 trk
  264.  
  265.     move.w #1,-(sp)        ; play
  266.     move.w #0,-(sp)        ; timera
  267.     appel xbios,135,6
  268.     ;move.b #%00000100,$ffff8900    ; buffer interrupts timer A at end
  269.  
  270.     move.w #1,-(sp)        ; no hand shaking
  271.     clr d0
  272.     move.b frequency_for_play,d0
  273.     move.w d0,-(sp)
  274.     move.w which_clock,-(sp)    ; interne 25 HHz=0, externe=1
  275.     move.w #8,-(sp)        ; destination : DAC
  276.     move.w #0,-(sp)        ; source : DMA
  277.     appel xbios,139,12
  278.  
  279.     ;move.w #%xxxx1100xxxxxxxx,$ffff8930; crossbar source
  280.     ;move.w #%0000100100000001,$ffff8930; hand-shake off 25Mhz
  281.     ;move.w #%xxxxxxxx1000xxxx,$ffff8932; crossbar destination
  282.     ;move.w #%0000000010011001,$ffff8932; connect, hand-shake off
  283.     ;move.b #%xxxx0100,$ffff8935    ; 20 KHz (internal clock)
  284.     ;move.b #%00000010,$ffff8937    ; source multiplexer
  285.     rts
  286.             ******
  287. set_timer_a:
  288.     pea -1
  289.     move.w #$134/4,-(sp)
  290.     appel bios,5,8
  291.     move.l d0,old_a
  292.  
  293.     pea direct_to_disk
  294.     move.w #1,-(sp)        ; data
  295.     move.w #%1000,-(sp)        ; control
  296.     move.w #0,-(sp)        ; timera
  297.     appel xbios,31,12
  298.  
  299.     ;move.b    #0,ctrla        ; arrete TA
  300.     ;move.l    #direct_to_disk,timera
  301.     ;move.b    #1,dataa
  302.     ;move.b    #%00001000,ctrla
  303.     ;bclr    #3,$fffffa17    ; automatic end of interrupt
  304.     
  305.     ;bset #5,$fffffa07        ; autorise le timer
  306.     ;bset #5,$fffffa13
  307.     rts
  308.  
  309. start_timer_a:
  310.     move.w #13,-(sp)
  311.     appel xbios,$1b,4
  312.     rts
  313.  
  314. stop_timer_a:
  315.     move.w #13,-(sp)
  316.     appel xbios,$1a,4
  317.     rts
  318.  
  319. restore_timera:
  320.     bsr stop_timer_a
  321.     ;move.b #0,ctrla        ; arrete TA
  322.     ;bclr #5,$fffffa07
  323.     ;bclr #5,$fffffa13
  324.     move.l old_a,-(sp)
  325.     move.w #$134/4,-(sp)
  326.     appel bios,5,8
  327.     rts
  328.  
  329.     BSS
  330. old_a:    ds.l 1
  331.     TEXT
  332.             *****************
  333. set_dma_play_buff_ad:    ; empilez d'abord la source puis la destination
  334.         ; on a déja le PC de retour d'empilé
  335. ;    movem.l d0-d1/a0-a1,-(sp)
  336. ;    movem.l 4+4*4(sp),a0/a1
  337. ;    pea (a0)        ; fin
  338. ;    pea (a1)        ; début
  339. ;    clr.w -(sp)
  340. ;    appel xbios,131,12        ; set dma replay buf
  341. ;    movem.l (sp)+,d0-d1/a0-a1
  342.  
  343.     move.b 1+8(a7),$ffff8903    ; adresse source (high)
  344.     move.b 2+8(a7),$ffff8905    ; (mid)
  345.     move.b 3+8(a7),$ffff8907    ; (low)
  346.     move.b 1+4(a7),$ffff890f    ; adresse de fin
  347.     move.b 2+4(a7),$ffff8911
  348.     move.b 3+4(a7),$ffff8913
  349.     rtd #8
  350.             ******
  351.  
  352. direct_to_disk:
  353.     tst end_of_file
  354.     beq.s .ok
  355.  
  356.     cmp.w #NBR_BUFF,semaphore    ; nb-1 : boucle dernier (1/2 rempli)
  357.     bge.s .fin_it2
  358.  
  359. .ok:            ; (ptr_d2d_inter)=prochain à jouer
  360.     save d0/a0
  361.     move.l ptr_d2d_inter,-(sp)    ; début à jouer
  362.  
  363.     move.l ptr_d2d_inter+4,d0    ; si on joue le dernier buffer
  364.     cmp.l ad_main_buffer,d0        ; en terme de place en mémoire
  365.     bne.s .pas_cool        ; alors la fin n'est pas #début !
  366.     move.l ad_main_buffer,d0
  367.     add.l #NBR_BUFF*LENGTH_REPLAY,d0
  368. .pas_cool:    move.l d0,-(sp)        ; fin à jouer
  369.     bsr set_dma_play_buff_ad
  370.  
  371.     lea ptr_d2d_inter,a0
  372.     move.l (a0),d0
  373.     REPT NBR_BUFF-1
  374.     move.l 4(a0),(a0)+        ; swapping des adresses des buffers
  375.     ENDR
  376.     move.l d0,ptr_d2d_inter+4*(NBR_BUFF-1)
  377. *    move.l d0,(a0)
  378.     addq.w #1,semaphore
  379.     load d0/a0
  380. .fin_it:    bclr #5,$fffffa0f.w        ; software end of interrupt
  381.     rte
  382.  
  383. .fin_it2:    addq.w #1,semaphore
  384.     bclr #5,$fffffa0f.w        ; software end of interrupt
  385.     rte
  386. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  387.     ; si end_of_file est mis : pas de lecture
  388.     ; mais le ptr_fichier est remis au début, nb. octets lus = 0
  389.  
  390. load_d0_at_a0:
  391.     tst end_of_file
  392.     beq.s .notend
  393.     clr.l d0
  394.     rts
  395.  
  396. .notend:    save d0/a0
  397.     file_read a0,d0,save_handle
  398.     load d1/a0            ; j'en voulais d1, j'en ai d0
  399.  
  400.     tst.l d0            ; on sait jamais
  401.     bgt.s .ok
  402.  
  403.     clr.l d0            ; pb lecture
  404.  
  405. .finfich:    move #1,end_of_file
  406.     rts            ; si d0=0 au retour : pb
  407.  
  408. .ok:    cmp.l d0,d1
  409.     bne.s .finfich        ; fin de fichier ?
  410.  
  411.     rts
  412.         ******************************
  413.     ; avec en a0 l'adresse ou charger et d0=nb.
  414.  
  415. init_rout1:    file_seek #0,save_handle,header
  416.     clr d7
  417.     rts
  418.  
  419. end_rout1:    rts
  420.  
  421. load_rout1:    save d0
  422.     bsr load_d0_at_a0        ; 16 bit/stéréo
  423.     load d1
  424.     lea 0(a0,d1.l),a1        ; fin buffer
  425.     sub.l d0,d1
  426.     beq.s .pas_pb
  427. .fill0:    clr.l -(a1)
  428.     subq.l #4,d1        ; stéréo
  429.     bgt.s .fill0
  430. .pas_pb:    rts
  431.             **********
  432. init_rout2:
  433.     file_seek #0,save_handle,header
  434.  
  435.     tst.l ad_buff_unpack
  436.     bne.s .fin_init_rout2
  437.  
  438.     move.l #LENGTH_REPLAY/2,d0    ; car mono
  439.     bsr allocate_dis_memory
  440.     bmi .plant
  441.     move.l d0,ad_buff_unpack
  442.  
  443. .fin_init_rout2:
  444.     tst replay_in_psst
  445.     bne init_rout2bis
  446.  
  447.     clr d7
  448. .plant:    rts
  449.  
  450. end_rout2:    move.l ad_buff_unpack,d0
  451.     bsr desallocate_dis_memory
  452.     clr.l ad_buff_unpack
  453.  
  454.     tst replay_in_psst
  455.     bne end_rout2bis
  456.  
  457.     rts
  458.  
  459. load_rout2:    tst.l ad_buff_unpack
  460.     beq.s findecomp2
  461.  
  462.     tst replay_in_psst
  463.     bne load_rout2bis
  464.  
  465. nb_ms_equal_to_zero:
  466.     lsr.l #1,d0            ; 16 bit/mono
  467.     save d0/a0
  468.     move.l ad_buff_unpack,a0
  469.     bsr load_d0_at_a0
  470.     load d1/a0
  471.  
  472.     lea 0(a0,d1.l),a1        ; fin buffer
  473.     sub.l d0,d1
  474.     beq.s .fullbuff
  475.  
  476. .fill0:    clr.l -(a1)
  477.     subq.l #2,d1
  478.     bgt.s .fill0
  479.     tst.l d0
  480.     beq.s findecomp2
  481.  
  482. .fullbuff:    move.l ad_buff_unpack,a1
  483.  
  484.     lsr.l #1,d0            ; en tout /8 (2*.L)
  485.  
  486. decomp2:    move.w (a1)+,d1        ; gauche=droite
  487.     move.w d1,(a0)+
  488.     move.w d1,(a0)+
  489.     subq.l #1,d0
  490.     bgt.s decomp2
  491.  
  492. findecomp2:    rts
  493.             **********
  494. init_rout2bis:
  495.     move #NB_WORD_IN_BUF_PSST-1,d0
  496.     lea buffer_psst,a0
  497. .clr:    clr.w (a0)+
  498.     dbf d0,.clr
  499.  
  500.     clr d7
  501.     rts
  502.  
  503. end_rout2bis:
  504.     rts
  505.  
  506. load_rout2bis:
  507.     tst nb_ms
  508.     beq nb_ms_equal_to_zero        ; mono normal
  509.  
  510.     lsr.l #1,d0            ; 16 bit/mono pseudo-stéréo
  511.     save d0/a0
  512.     move.l ad_buff_unpack,a0
  513.     bsr load_d0_at_a0
  514.     load d1/a0
  515.  
  516.     lea 0(a0,d1.l),a1        ; fin buffer
  517.     sub.l d0,d1
  518.     beq.s .fullbuff
  519.  
  520. .fill0:    clr.l -(a1)
  521.     subq.l #2,d1
  522.     bgt.s .fill0
  523.     tst.l d0
  524.     beq findecomp2bis
  525.  
  526. .fullbuff:
  527.  
  528.     move.l ad_buff_unpack,a1
  529.  
  530.     lsr.l #1,d0            ; en tout /8 (2*.L)
  531.  
  532. *    move #20,nb_ms
  533.     move nb_ms,d2
  534.     bpl.s .pos
  535.     neg d2
  536. .pos:
  537.     lea table_cv_freq,a2
  538.     move.b frequency_for_play,d1
  539. .redo:    cmp.b 3(a2),d1
  540.     beq.s .found
  541.     lea 8(a2),a2
  542.     bra.s .redo
  543. .found:    move.w 6(a2),d1
  544.     mulu d2,d1            ; d2=abs(nb. ms)
  545.     divu #1000,d1        ; en ms (10e-3)
  546.     ext.l d1
  547.     move d1,nb_valdecal
  548.  
  549.     ; 11111122222222222222222 333333    ; si nb_ms > 0
  550.     ; 22222222222222222333333
  551.  
  552. .copy_old:    move.w d1,d2
  553.     lea buffer_psst,a2
  554.     move.l a0,a3
  555.     tst nb_ms
  556.     bpl.s .pos2
  557.     lea 2(a3),a3
  558. .pos2:
  559. .redo1:    move.w (a2)+,(a3)
  560.     lea 4(a3),a3
  561.     subq.w #1,d2
  562.     bne.s .redo1
  563.  
  564. .copy_new:    move.l d0,d2
  565.     sub.l d1,d2
  566.     bmi .planta
  567.     move.l a0,a4
  568.     tst nb_ms
  569.     bmi.s .pos3
  570.     lea 2(a4),a4
  571. .pos3:
  572. .redo2:    move.w (a1)+,d3
  573.     move.w d3,(a3)    ; a3 pointe la suite
  574.     move.w d3,(a4)
  575.     lea 4(a3),a3
  576.     lea 4(a4),a4
  577.     subq.l #1,d2
  578.     bne.s .redo2
  579.  
  580. .copy_next:    move.w d1,d2
  581.     lea buffer_psst,a2
  582. .redo3:    move.w (a1)+,d3
  583.     move.w d3,(a2)+
  584.     move.w d3,(a4)    ; a4 pointe la suite
  585.     lea 4(a4),a4
  586.     subq #1,d2
  587.     bne.s .redo3
  588.  
  589. .planta:
  590. findecomp2bis:
  591.     rts
  592.  
  593.             **********
  594. init_rout3:
  595.     tst.l ad_buff_unpack
  596.     bne .fin_init_rout3
  597.  
  598.     file_read #temporaire1,#16,save_handle
  599.     cmp.l #16,d0
  600.     bne .plant2
  601.  
  602.     lea temporaire1,a0
  603.  
  604.     cmp.l #'DVSM',dvs_header(a0)
  605.     bne .plant2
  606.     tst.w dvs_header+4(a0)
  607.     bne .plant2
  608.     move.w dvs_length(a0),length_tete+2
  609.     move.w dvs_freq(a0),frequency_replay
  610.     cmp.b #2,dvs_pack(a0)        ; 2=packé
  611.     bne .plant2
  612.  
  613.     move.b dvs_mode(a0),d0
  614.     cmp.b #1,d0
  615.     bne.s .pas_st
  616.     move.l #4,how_many_1st_bytes
  617.     bra.s .cont
  618. .pas_st:    cmp.b #3,d0
  619.     bne .plant2
  620.     move.l #2,how_many_1st_bytes    ; mono
  621. .cont:    move d0,dvs_type_of_sound
  622.  
  623.     move.l dvs_block_length(a0),blk_length
  624.  
  625.     lea table_dvsm,a0    ; table DVSM par défaut
  626.     lea table_dec_dvsw,a1
  627.     move #256-1,d0
  628. .copy:    move.w (a0)+,(a1)+
  629.     dbf d0,.copy
  630.  
  631.     move.l #16,d7
  632.  
  633. .view_cookies:
  634.     file_read #temporaire1,#6,save_handle
  635.     cmp.l #6,d0
  636.     bne .plant2
  637.  
  638.     lea temporaire1,a0
  639.  
  640.     cmp.l #'LPKC',cookie_identify(a0)
  641.     beq.s .lpck
  642.     cmp.l #'PACK',cookie_identify(a0)
  643.     beq.s .pack
  644.  
  645.     clr.l d0
  646.     move.w cookie_length(a0),d0
  647.     add.w d0,d7
  648.     subq.l #6,d0
  649.     file_seek #1,save_handle,d0
  650.  
  651. .finish_cookie:
  652.     cmp.l length_tete,d7
  653.     bne.s .view_cookies
  654.     bra.s .fincookies
  655.  
  656. .lpck:    file_read #temporaire1,#2,save_handle
  657.     cmp.l #2,d0
  658.     bne .plant2
  659.     add.l #8,d7
  660.     cmp.w #8,temporaire1        ; 8 bit pack-code
  661.     beq.s .finish_cookie
  662.     bra .plant2
  663.  
  664. .pack:    file_read #table_dec_dvsw,#256*2,save_handle
  665.     cmp.l #256*2,d0
  666.     bne .plant2
  667.     add.l #4+2+256*2,d7
  668.     bra.s .finish_cookie
  669.  
  670. .fincookies:
  671.  
  672.     clr.l d0
  673.     clr d1
  674. .find_ideal_size:
  675.     add.l blk_length,d0
  676.     addq #1,d1
  677.     cmp.l #LENGTH_REPLAY,d0        ; pour qu'à chaque accès
  678.     blt.s .find_ideal_size        ; disque on charge un nombre
  679.     move.w d1,nbr_of_buffers_allocated    ; correct d'octets (limiter les accès)
  680.  
  681.     bsr allocate_dis_memory
  682.     bmi .plant2
  683.     move.l d0,ad_buff_unpack
  684.  
  685. .fin_init_rout3:
  686.     file_seek #0,save_handle,length_tete    ; pour être sur
  687.  
  688.     clr.l octets_left_in_buff
  689.  
  690.     tst replay_in_psst
  691.     bne.s init_rout3bis
  692.  
  693.     clr d7
  694.     rts
  695.  
  696. .plant2:    moveq #BAD_DVW_HEADER,d7
  697.     rts
  698.  
  699. init_rout3bis:
  700.     move #NB_WORD_IN_BUF_PSST-1,d0
  701.     lea buffer_psst,a0
  702. .clr:    clr.w (a0)+
  703.     dbf d0,.clr
  704.  
  705.     clr d7
  706.     rts
  707.  
  708.  
  709. end_rout3:    move.l ad_buff_unpack,d0
  710.     bsr desallocate_dis_memory
  711.     clr.l ad_buff_unpack
  712.  
  713.     rts
  714.  
  715.  
  716. load_rout3:    tst.l ad_buff_unpack
  717.     beq findecomp3
  718.  
  719. *    cmp #1,dvs_type_of_sound
  720. *    beq.s .ste
  721. *    lsr.l #1,d0
  722. *.ste:
  723.     ; a0 = destination for data unpack
  724.     ; d0= nbr. bytes awaited
  725.     movem.l d0/a0,save_for_delay
  726.     move.l octets_left_in_buff,d1    ; le ! registre important
  727.     move.l progression,d2
  728.     movem.w old_values,d3/d4
  729.     move.l saved_pointer,a1
  730.     lea table_dec_dvsw+128*2,a2
  731.  
  732.     tst.l d1
  733.     bne.s gogo
  734.  
  735. reload:    save d0-d4/a0-a2
  736.     clr.l d0
  737.     move nbr_of_buffers_allocated,d0
  738.     mulu.l blk_length,d0
  739.     move.l ad_buff_unpack,a0
  740.     bsr load_d0_at_a0
  741.     move.l d0,d5
  742.     load d0-d4/a0-a2
  743.     move.l d5,d1
  744.     beq fin_fichier
  745.     blt findecomp3        ; si 0 octets de lus
  746.     move.l ad_buff_unpack,a1
  747.     clr.l d2
  748.  
  749. gogo:    cmp #1,dvs_type_of_sound    ; 0=stéréo, 1=mono
  750.     bne.s its_mono
  751.  
  752. its_stereo:    tst.l d2
  753.     bne.s .redo
  754. .remake:    move.w (a1)+,d3
  755.     move.w (a1)+,d4
  756.     move.w d3,(a0)+
  757.     move.w d4,(a0)+
  758.     sub.l #4,d1
  759.     add.l #4,d2
  760.     sub.l #4,d0
  761.     beq fin_depack
  762.  
  763. .redo:    move.b (a1)+,d5
  764.     ext.w d5
  765.     add.w (a2,d5.w*2),d3
  766.     move.w d3,(a0)+
  767.  
  768.     move.b (a1)+,d5
  769.     ext.w d5
  770.     add.w (a2,d5.w*2),d4
  771.     move.w d4,(a0)+
  772.  
  773.     sub.l #2,d1
  774.     add.l #2,d2
  775.     sub.l #4,d0
  776.     beq.s fin_depack
  777.     tst.l d1
  778.     beq.s reload
  779.     cmp.l blk_length,d2
  780.     bne.s .redo
  781.     clr.l d2
  782.     bra.s .remake
  783.  
  784. its_mono:    tst.l d2
  785.     bne.s .redo
  786. .remake:    move.w (a1)+,d3
  787.     move.w d3,(a0)+
  788.     move.w d3,(a0)+
  789.     sub.l #2,d1
  790.     add.l #2,d2
  791.     sub.l #4,d0
  792.     beq.s fin_depack
  793.  
  794. .redo:    move.b (a1)+,d5
  795.     ext.w d5
  796.     add.w (a2,d5.w*2),d3
  797.     move.w d3,(a0)+
  798.     move.w d3,(a0)+
  799.  
  800.     sub.l #1,d1
  801.     add.l #1,d2
  802.     sub.l #4,d0
  803.     beq.s fin_depack
  804.     tst.l d1
  805.     beq reload
  806.     cmp.l blk_length,d2
  807.     bne.s .redo
  808.     clr.l d2
  809.     bra.s .remake
  810.  
  811. fin_fichier:            ; d1 est nul
  812. .fill0:    clr.l (a0)+
  813.     subq.l #4,d0
  814.     bgt.s .fill0
  815.  
  816. fin_depack:
  817.     move.l d1,octets_left_in_buff
  818.     move.l d2,progression
  819.     movem.w d3/d4,old_values
  820.     move.l a1,saved_pointer
  821.  
  822.     cmp #1,dvs_type_of_sound    ; 0=stéréo, 1=mono
  823.     beq no_delay
  824.  
  825.     tst replay_in_psst
  826.     beq no_delay
  827.  
  828.     movem.l save_for_delay,d0/a0
  829.  
  830.     move nb_ms,d2
  831.     beq no_delay
  832.     bpl.s .pos
  833.     neg d2
  834. .pos:
  835.     lea table_cv_freq,a2
  836.     move.b frequency_for_play,d1
  837. .redo:    cmp.b 3(a2),d1
  838.     beq.s .found
  839.     lea 8(a2),a2
  840.     bra.s .redo
  841. .found:    move.w 6(a2),d1
  842.     mulu d2,d1            ; d2=abs(nb. ms)
  843.     divu #1000,d1        ; en ms (10e-3)
  844.     ext.l d1
  845.     move d1,nb_valdecal
  846.  
  847.     ; 11111122222222222222222 333333    ; si nb_ms > 0
  848.     ; 22222222222222222333333
  849.  
  850. .copy_old:    move.w d1,d2
  851.     lea buffer_psst,a2
  852.     move.l a0,a3
  853.     tst nb_ms
  854.     bpl.s .pos2
  855.     lea 2(a3),a3
  856. .pos2:
  857. .redo1:    move.w (a2)+,(a3)
  858.     lea 4(a3),a3
  859.     subq.w #1,d2
  860.     bne.s .redo1
  861.  
  862. .copy_new:    move.l d0,d2
  863.     lsr.l #2,d2        ; car mono & packé
  864.     sub.l d1,d2
  865.     bmi .planta
  866.     move.l a0,a4
  867.     tst nb_ms
  868.     bmi.s .pos3
  869.     lea 2(a4),a4
  870. .pos3:
  871. .redo2:    move.w (a4),(a3)    ; a3 pointe la suite
  872.     lea 4(a3),a3
  873.     lea 4(a4),a4
  874.     subq.l #1,d2
  875.     bne.s .redo2
  876.  
  877. .copy_next:    move.w d1,d2
  878.     lea buffer_psst,a2
  879. .redo3:    move.w (a4),(a2)+    ; a4 pointe la suite
  880.     lea 4(a4),a4
  881.     subq #1,d2
  882.     bne.s .redo3
  883. .planta:
  884.  
  885. no_delay:
  886. findecomp3:    rts
  887.  
  888.     
  889.  BSS
  890. nbr_of_buffers_allocated:ds.w 1
  891. octets_left_in_buff:    ds.l 1    ; combien de données brutes non depackées
  892. progression:    ds.l 1    ; quel offset / taille 1 block (pour entete)
  893. saved_pointer:    ds.l 1    ; à quelle adresse dans les datas
  894. old_values:        ds.w 2
  895.  
  896. save_for_delay:    ds.l 2    ; d0/a0
  897.  
  898. length_tete:    ds.l 1
  899. frequency_replay:    ds.w 1
  900. how_many_1st_bytes:    ds.w 1
  901. dvs_type_of_sound:    ds.w 1    ; 0=stéréo 8bit / 1=stéréo 16 bit / 2=mono 8bit / 3=mono 16 bit
  902. blk_length:        ds.l 1
  903.  
  904. temporaire1:    ds.b 16
  905. table_dec_dvsw:    ds.w 256    ; quand on fait une décompression
  906.  TEXT
  907.  
  908.         *********************************
  909. stop_if_running:
  910.     tst sample_playing
  911.     beq.s .no
  912.     bsr restore_d2d        ; & stop d2d & unlock
  913.     clr sample_playing
  914. .no:    rts
  915.         *********************************
  916.  
  917.     DATA
  918. table_dvsm:    incbin dvsm.tab
  919.  
  920. table_routs:dc.l init_rout1,load_rout1,end_rout1
  921.     dc.l init_rout2,load_rout2,end_rout2
  922.     dc.l init_rout3,load_rout3,end_rout3
  923.  
  924.     BSS
  925.  
  926. sample_playing:    ds.w 1        ; 0=non, 1=oui.
  927. semaphore:        ds.w 1
  928. semaphore_2:    ds.w 1
  929. save_handle:    ds.w 1
  930. end_of_file:    ds.w 1        ; 1=fin du fichier
  931.  
  932. name_2_load:    ds.b 256        ; nom du track
  933.  
  934. ad_main_buffer:    ds.l 1        ; le grand buffer tournant
  935. ad_buff_unpack:    ds.l 1        ; pour toutes les routines
  936.  
  937. loop:        ds.w 1
  938. header:        ds.l 1        ; longeur à sauter au début
  939. which_rout:        ds.w 1        ; 1..3 = rout No 1..3
  940. which_clock:    ds.w 1        ; 0=interne; 1=externe
  941. replay_in_psst:    ds.w 1        ; si possible : 0=non 1=oui
  942. frequency_for_play:    ds.b 1
  943.  even
  944.  
  945. NB_WORD_IN_BUF_PSST=5000        ; sert pour rout 2 et rout 3
  946.  
  947. nb_ms:    ds.w 1            ; compris entre -99 et 99
  948. nb_valdecal:ds.w 1
  949. buffer_psst:ds.w NB_WORD_IN_BUF_PSST    ; 100e-3*50000
  950.  
  951.     TEXT
  952. ****************************************************************************
  953.